package Servicio;

import Model.Caja; 
import Model.Congreso; 
import Model.Pedido; 
import Model.Usuario; 
import Model.Cliente;
import Model.Detalle;
import Model.Gasto;
import Model.Ingreso;
import Model.Permiso;
import Model.Reposicion;
import Model.VentasXCongreso;
import Model.VentasXMes;
import Model.Moneda;
import java.util.*;
//import java.lang.Object;
import javax.swing.JFrame;
import javax.swing.JOptionPane;




public class Facade {

    
    public Facade () {
    }

    /** Obtiene un congreso a partir de su clave primaria*/ 
    public static Congreso obtenerCongreso (String iniciales, String fechaInicio) {
       Congreso auxCon;
       ManejadorCongreso creador = new ManejadorCongreso();
       creador.setFiltro(1, iniciales, fechaInicio);
       ArrayList<Object> auxObject = creador.FactoryMethod();
       if (auxObject.isEmpty())
           auxCon=null;
       else
            auxCon = (Congreso)auxObject.get(0);
       return auxCon;
    }

    /** Obtiene un arreglo con todos los congresos (Sin pedidos)*/
    public static ArrayList<Congreso> obtenerCongresos() {
      
        ArrayList<Congreso> auxCon= new ArrayList<Congreso>();
        ManejadorCongreso creador = new ManejadorCongreso();
        creador.setFiltro(0, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCon.add(((Congreso)(auxObject.get(i))));
        return auxCon;
    }
  
    /** Obtiene un arreglo con todos los congresos (Sin pedidos) para la importacion*/
    public static ArrayList<Congreso> obtenerCongresosViejos() {
      
        ArrayList<Congreso> auxCon= new ArrayList<Congreso>();
        ManejadorCongreso creador = new ManejadorCongreso();
        creador.setFiltro(4, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCon.add(((Congreso)(auxObject.get(i))));
        return auxCon;
    }
    
    public static ArrayList<Congreso> obtenerCongresosNuevos() {
      
        ArrayList<Congreso> auxCon= new ArrayList<Congreso>();
        ManejadorCongreso creador = new ManejadorCongreso();
        creador.setFiltro(3, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCon.add(((Congreso)(auxObject.get(i))));
        return auxCon;
    }
    
    /** Obtiene un arreglo con todos los congresos que tiene envios a realizar (Sin pedidos)*/
    public static ArrayList<Congreso> obtenerCongresosConEnvios() {
      
        ArrayList<Congreso> auxCon= new ArrayList<Congreso>();
        ManejadorCongreso creador = new ManejadorCongreso();
        creador.setFiltro(2, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCon.add(((Congreso)(auxObject.get(i))));
        return auxCon;
    }
    
    /**Obtiene todos los envios*/
    
    public static ArrayList<Pedido> obtenerEnvios () {
        ArrayList<Pedido> auxPed= new ArrayList<Pedido>();
        ManejadorPedido creador = new ManejadorPedido();
        creador.setFiltro(3, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            auxPed.add(((Pedido)(auxObject.get(i))));
        }
        return auxPed;
    }
    
    /** Obtiene el tren de copiado*/    
    public static void obtenerTren(ArrayList<String> dvds,ArrayList<String> cantidad, Congreso cong) {
      
        ManejadorDVD creador = new ManejadorDVD();
        creador.setFiltro(1, cong.getIniciales(), cong.getFechaInicio());
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            dvds.add(((String)(auxObject.get(i))));
        creador.setFiltro(2, cong.getIniciales(), cong.getFechaInicio());
        auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            cantidad.add(((String)(auxObject.get(i))));
        
        
    }
  /** Obtiene diferentes conjuntos expandibles que hay */
  /* le pasas int tipo donde tipo es lo que queres traer.
   * 4. Especialidades
     5. Localidades
     6. Provincias
     7. Paises*/ 
    public static ArrayList<String> obtenerConjuntoExpandible (int tipo) {
        
        ArrayList<String> tipoDato= new ArrayList<String>();
        ManejadorConjuntosExpandibles creador = new ManejadorConjuntosExpandibles();
        creador.setFiltro(tipo, "%", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            tipoDato.add(((String)(auxObject.get(i))));
        return tipoDato;
    }
    
    
    /** Obtiene un arreglo con todos los apellidos de los clientes*/
    public static ArrayList<String> obtenerApellidos(){
        int repetido = 0;
        ArrayList<String> auxCli= new ArrayList<String>();
        ManejadorCliente creador = new ManejadorCliente();
        creador.setFiltro(4, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            for (int j=0; j<auxCli.size();j++){
                if (auxCli.size()>0){
                if (auxCli.get(j).compareTo((String)(auxObject.get(i)))==0){
                    repetido = 1;
                }}}
                if (repetido == 0){
                auxCli.add(((String)(auxObject.get(i))));
                }else{
                repetido = 0;
                }
        }
        return auxCli;
    }
    
   /**Obtiene a todos los clientes */ 
    public static ArrayList<Cliente> obtenerClientes () {
        
        ArrayList<Cliente> auxCli= new ArrayList<Cliente>();
        ManejadorCliente creador = new ManejadorCliente();
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCli.add(((Cliente)(auxObject.get(i))));
        return auxCli;
    }
    
    
    /**Obtiene a todos los clientes que no tienen pedidos */ 
    public static ArrayList<Cliente> obtenerClientesNuevos () {
        
        ArrayList<Cliente> auxCli= new ArrayList<Cliente>();
        ManejadorCliente creador = new ManejadorCliente();
        creador.setFiltro(3, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxCli.add(((Cliente)(auxObject.get(i))));
        return auxCli;
    }

  /**Almacena al Pedido junto con el cliente*/ 
    public static boolean almacenarPedido (Pedido pedido) {
        if (almacenarCliente(pedido.getCliente())){
        ManejadorPedido creador = new ManejadorPedido();
        creador.setFiltro(4, pedido.getCongreso().getIniciales(), pedido.getCongreso().getFechaInicio());
        ArrayList<Object> auxObject = creador.FactoryMethod();
        int numero=0;
        try{
            Pedido auxPedido = (Pedido)(auxObject.get(0));
            numero=auxPedido.getNroPedido()+1;
        }catch(Exception e){numero=1;}  //si no existen pedidos
        creador.setFiltro(0, String.valueOf(numero), "nada");
        creador.insert(pedido);   
        pedido.setNroPedido(numero);
        ManejadorDVD creadorDVD = new ManejadorDVD();
        creadorDVD.setFiltro(0, String.valueOf(pedido.getCliente().getIdCli()), pedido.getFecha());
        for (int i=1;i<=pedido.getDVDs().size();i++){
            creadorDVD.insert(pedido.getDVDs().get(i-1));
        }     
        return true;
        }
        else return false;
    }

   /** Obtiene todos los pedidos de un congreso junto con su cliente asociado */
    public static ArrayList<Pedido> obtenerPedidos (Congreso cong) {
        ArrayList<Pedido> auxPed= new ArrayList<Pedido>();
        ManejadorPedido creador = new ManejadorPedido();
        creador.setFiltro(0, cong.getIniciales(), cong.getFechaInicio());
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            auxPed.add(((Pedido)(auxObject.get(i))));
            auxPed.get(i).setCongreso(cong);
        }
        return auxPed;
    }
    
    /** Obtiene todos los pedidos de un una Caja junto con su cliente asociado */
    public static ArrayList<Pedido> obtenerPedidosCaja (Congreso cong) {
        ArrayList<Pedido> auxPed= new ArrayList<Pedido>();
        ManejadorPedido creador = new ManejadorPedido();
        if (cong.getIniciales().compareTo("OFICE")==0 && cong.getFechaInicio().compareTo("2000-01-01 00:00:00")==0)
            creador.setFiltro(2, "nada", "nada");
        else
            creador.setFiltro(1, cong.getIniciales(), cong.getFechaInicio());
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxPed.add(((Pedido)(auxObject.get(i))));
        return auxPed;
    }

    /** Modifica el estado de un pedido */
    public static void modificarPedido (Pedido pedido) {
        ManejadorPedido creador = new ManejadorPedido();
        creador.update(pedido);
    }

  
    /** Obtiene la caja de un congreso determinado junto con su arreglo de Gastos*/ 
    public static Caja obtenerCaja (Congreso cong) {
        Caja auxCaj= new Caja();
        ManejadorCaja creador = new ManejadorCaja();
        creador.setFiltro(1, cong.getIniciales(), cong.getFechaInicio());
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty())
           auxCaj=null;
       else
            auxCaj = (Caja)auxObject.get(0);
       return auxCaj;

    }

/** Modifica el saldo inicial de la caja de un congreso*/
    public static void modificarSaldoIni (Congreso cong) {
        ManejadorCaja creador = new ManejadorCaja();
        creador.update(cong);
    }

/** Agrega un Gasto al a Caja de un Congreso */  
    public static void modificarGasto (Congreso cong, Gasto gasto) {
        ManejadorGasto creador = new ManejadorGasto();
        creador.setFiltro(0, cong.getIniciales(), cong.getFechaInicio());
        creador.insert(gasto);
    }
    
    public static boolean eliminaGasto(String val){
        ManejadorGasto creador = new ManejadorGasto();
        try{
        creador.delete(val);
        return true;
        }catch(Exception e){
            return false;
        }
    }
    
    public static boolean eliminaIngreso(String val){
        ManejadorIngreso creador = new ManejadorIngreso();
        try{
        creador.delete(val);
        return true;
        }catch(Exception e){
            return false;
        }
    }
    
    /** Agrega un Ingreso al a Caja de un Congreso */  
    public static void modificarIngreso(Congreso cong, Ingreso ingreso) {
        ManejadorIngreso creador = new ManejadorIngreso();
        creador.setFiltro(0, cong.getIniciales(), cong.getFechaInicio());
        creador.insert(ingreso);
    }

    public static void agregarExtraccion(Congreso cong, Ingreso ingreso) {
        ManejadorIngreso creador = new ManejadorIngreso();
        creador.setFiltro(1, cong.getIniciales(), cong.getFechaInicio());
        creador.insert(ingreso);
    }
    
    public static void agregarAdelanto(Congreso cong, Ingreso ingreso) {
        ManejadorIngreso creador = new ManejadorIngreso();
        creador.setFiltro(2, cong.getIniciales(), cong.getFechaInicio());
        creador.insert(ingreso);
    }
    
/** Devuelve el usuario y sus permisos (si existe, sino devuelve nulo)*/
    public static Usuario validarUsuario (String nombreUsuario, String password) {
        Usuario auxUsu=null;
        ManejadorUsuario creador = new ManejadorUsuario();
        creador.setFiltro(1, nombreUsuario, password);
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.size()>0)
            auxUsu=(Usuario)auxObject.get(0);
        return auxUsu;
    }
 
/** Actualiza la contraseña del usuario*/    
    public static void cambiarPass(Usuario usuario) {
        ManejadorUsuario creador = new ManejadorUsuario();
        creador.update(usuario);
        
    }
 
 /** Almacena un nuevo congreso junto con su caja asociada*/
    public static boolean almacenarCongreso (Congreso congreso) {
            ManejadorCongreso creador = new ManejadorCongreso();
            if (creador.insert(congreso) == false) return false;
            ManejadorCaja creadorCaj = new ManejadorCaja();
            creadorCaj.setFiltro(0, congreso.getIniciales(), congreso.getFechaInicio());
            creadorCaj.insert(congreso.getCaja());
            Reposicion rep=new Reposicion(congreso.getStockDvd(),'i');
            rep.setCongreso(congreso);
            almacenarReposicion(rep);
        
        return true;
        
    }
    
    /** Almacena una reposicion de stock*/
    public static boolean almacenarReposicion(Reposicion rep) {
             ManejadorReposicion creador = new ManejadorReposicion();
            if (creador.insert(rep) == false) return false;        
        return true;
    }
    
 /**Modifica en la base de datos el estado nuevo del congreso (eliminado o inactivo)*/   
    public static void modificarCongreso(Congreso congreso){
        ManejadorCongreso creador = new ManejadorCongreso();
        creador.update(congreso);
    }
 
 /**Obtiene todos los permisos disponibles*/   
    public static ArrayList<Permiso> obtenerPermisos(){
        ArrayList<Permiso> auxPer= new ArrayList<Permiso>();
        ManejadorPermiso creador = new ManejadorPermiso();
        creador.setFiltro(0, "nada", "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxPer.add(((Permiso)(auxObject.get(i))));
        return auxPer;  
    }
 
 /**Almacena al usuario con sus permisos correspondientes*/  
    public static boolean almacenarUsuario(Usuario usuario){
            ManejadorUsuario creador = new ManejadorUsuario();
            if (creador.insert(usuario)==false) return false;
            ManejadorPermiso creadorPer = new ManejadorPermiso();
            creadorPer.setFiltro(0, usuario.getNombreUsuario(), "nada");
            try {
                for (int i=0; i<usuario.getPermiso().size(); i++)
                    creadorPer.insert(usuario.getPermiso().get(i));
            } catch (Exception e) {
                e.printStackTrace(); 
            }
  
        return true;        
    }
  
  /**Obtiene todos los usuarios con sus permisos correspondientes*/ 
    public static ArrayList<Usuario> obtenerUsuarios(){
        ArrayList<Usuario> auxUsu= new ArrayList<Usuario>();
        ManejadorUsuario creador = new ManejadorUsuario();
        ArrayList<Object> auxObject = creador.FactoryMethod();
        for (int i=0;i<auxObject.size();i++)
            auxUsu.add(((Usuario)(auxObject.get(i))));
        return auxUsu;
    }
    
  /**Elimina al usuario y a sus permisos asociados de la base de datos*/  
    public static void eliminarUsuario(Usuario usuario){
        ManejadorPermiso creadorPer = new ManejadorPermiso();
        creadorPer.delete(usuario);   
        ManejadorUsuario creador = new ManejadorUsuario();
        creador.delete(usuario);        
    }
    
      /**Elimina el pedido y sus DVDs de la base de datos*/  
    public static void eliminarPedido(Pedido pedido){
         

        ManejadorDVD creador = new ManejadorDVD();
        creador.setFiltro(0, pedido.getFecha(), String.valueOf(pedido.getCliente().getIdCli()));
        creador.delete(null);
        ManejadorPedido creadorPed = new ManejadorPedido();
        creadorPed.setFiltro(0, pedido.getFecha(), String.valueOf(pedido.getCliente().getIdCli()));
        creadorPed.delete(null);   
                
    }
  
 /**Los permisos del usuario son los nuevos*/   
    public static void modificarUsuario(Usuario usuario){
        ManejadorPermiso creadorPer = new ManejadorPermiso();
        creadorPer.delete(usuario); 
        creadorPer.setFiltro(0, usuario.getNombreUsuario(), "nada");
        try {
            for (int i=0; i<usuario.getPermiso().size(); i++)
                creadorPer.insert(usuario.getPermiso().get(i));
        } catch (Exception e) {e.printStackTrace(); }
        
        
    }
    
    //Devuelve los detalles (estadisticas) de un Cliente, o nulo si no existe    
    public static Detalle detallesCliente(Cliente cliente){
        Facade.sacarComilla(cliente);
        String auxCadena=cadBusquedaCliente(cliente);
        ManejadorCliente creador = new ManejadorCliente();
        creador.setFiltro(2, auxCadena, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty()){
            return null;
        }
        else{
           cliente.setIdCli(((Cliente)auxObject.get(0)).getIdCli());
           ManejadorReportes creaFijos= new ManejadorReportes();
           creaFijos.setFiltro(0, String.valueOf(cliente.getIdCli()), "nada");
           auxObject = creaFijos.FactoryMethod();
           if (auxObject.isEmpty())
            return null;
           else
               return ((Detalle)(auxObject.get(0)));
           
        }
    }
    
  //Devuelve los detalles (estadisticas) de todos los clientes    
    public static ArrayList<Detalle> detallesCliente(){
        ArrayList<Detalle> auxDet = new ArrayList<Detalle>();
        ManejadorReportes creaRep= new ManejadorReportes();
        creaRep.setFiltro(1, "nada", "nada");
        ArrayList<Object> auxObject = creaRep.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            auxDet.add(((Detalle)(auxObject.get(i))));
        }
        return auxDet;
    }
    
  //Devuelve las ventas por mes    
    public static ArrayList<VentasXMes> obtenerVentasXMes(){
        ArrayList<VentasXMes> auxDet = new ArrayList<VentasXMes>();
        ManejadorReportes creaRep= new ManejadorReportes();
        creaRep.setFiltro(2, "nada", "nada");
        ArrayList<Object> auxObject = creaRep.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            auxDet.add(((VentasXMes)(auxObject.get(i))));
        }
        return auxDet;
    }
    
  //Devuelve las ventas por Congreso    
    public static ArrayList<VentasXCongreso> obtenerVentasXCongreso(){
        ArrayList<VentasXCongreso> auxDet = new ArrayList<VentasXCongreso>();
        ManejadorReportes creaRep= new ManejadorReportes();
        creaRep.setFiltro(3, "nada", "nada");
        ArrayList<Object> auxObject = creaRep.FactoryMethod();
        for (int i=0;i<auxObject.size();i++){
            auxDet.add(((VentasXCongreso)(auxObject.get(i))));
        }
        return auxDet;
    }
    
    
/*
 * Metodos internos del paquete
 * 
 */    
    
    
    
    /**Obtiene todos los permisos de un determinado usuario*/   
    static ArrayList<Permiso> obtenerPermisos(Usuario usuario){
        ArrayList<Permiso> auxPer= new ArrayList<Permiso>();
        ManejadorPermiso creador = new ManejadorPermiso();
        creador.setFiltro(1, usuario.getNombreUsuario(), "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        try {
            for (int i=0;i<auxObject.size();i++)
                auxPer.add(((Permiso)(auxObject.get(i))));
        } catch (Exception e) {e.printStackTrace(); }
        return auxPer;  
    }
    
    /** Obtiene un solo cliente coincidente con el ID, 
     * Usado generalmente para traer el cliente del pedido
     */
    static Cliente obtenerCliente(String id_c) {
        
        Cliente auxCli= new Cliente();
        ManejadorCliente creador = new ManejadorCliente();
        creador.setFiltro(1, id_c, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty())
           auxCli=null;
       else
            auxCli = (Cliente)auxObject.get(0);
       return auxCli;
    }
    
    /** Obtiene los DVD de un determinado Pedido*/
    static ArrayList<Integer> obtenerDVDs(String id_c, String fecha){
       ArrayList<Integer> auxInt= new ArrayList<Integer>(); 
       ManejadorDVD creador = new ManejadorDVD();
       creador.setFiltro(0, id_c, fecha);
       ArrayList<Object> auxObject = creador.FactoryMethod();
       for (int i=0;i<auxObject.size();i++)
            auxInt.add(((Integer)(auxObject.get(i))));
       return auxInt;
    }
    /** Obitene los gastos de una determinada caja*/
    static ArrayList<Gasto> obtenerGastos(String iniciales, String fecha){
       ArrayList<Gasto> auxGas= new ArrayList<Gasto>(); 
       ManejadorGasto creador = new ManejadorGasto();
       creador.setFiltro(0, iniciales, fecha);
       ArrayList<Object> auxObject = creador.FactoryMethod();
       for (int i=0;i<auxObject.size();i++)
            auxGas.add(((Gasto)(auxObject.get(i))));
       return auxGas;
    }
    /** Obitene los ingresos de una determinada caja*/
    static ArrayList<Ingreso> obtenerIngresos(String iniciales, String fecha,int val){
       ArrayList<Ingreso> auxIng= new ArrayList<Ingreso>(); 
       ManejadorIngreso creador = new ManejadorIngreso();
       creador.setFiltro(val, iniciales, fecha);
       ArrayList<Object> auxObject = creador.FactoryMethod();
       for (int i=0;i<auxObject.size();i++)
            auxIng.add(((Ingreso)(auxObject.get(i))));
       return auxIng;
    }

    /** Obtiene el id de los conjuntos de elementos fijos
     * @param opc = 0 -> Estado de congreso
     * @param opc = 1 -> Estado de pedido
     * @param opc = 2 -> Tipo de documento
     * @param opc = 3 -> Devuelve el ultimo id insertado
     */
    static int obtenerIdFijo(String nombre, int opc){
        
        int auxId;
        ManejadorConjuntosFijos creador = new ManejadorConjuntosFijos();
        creador.setFiltro(opc, nombre, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty())
           auxId=0;
       else
            auxId = (Integer)auxObject.get(0);
       return auxId;
        
    }
   
    /** Obtiene el id de los conjuntos de elementos expandibles
     * @param opc = 0 -> Especialidades
     * @param opc = 1 -> Localidades
     * @param opc = 2 -> Provincias
     * @param opc = 3 -> Paises
      * @param opc = 8-> Tipo Gasto
     */
    static int obtenerIdExpandible(String nombre, int opc){
        int auxId=0;
        nombre=capitalLetters(nombre);
        ManejadorConjuntosExpandibles creador = new ManejadorConjuntosExpandibles();
        creador.setFiltro(opc, nombre, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty()){
//            nombre=StringUtils.capitalize(nombre);
            creador.insert(nombre);
           auxId=Facade.obtenerIdExpandible(nombre, opc);
        }
       else
            auxId = (Integer)auxObject.get(0);
        
       return auxId;
    }
    
    static String obtenerSimbMoneda(String nombre){
        String auxId="00";
        //nombre=capitalLetters(nombre);
        ManejadorConjuntosExpandibles creador = new ManejadorConjuntosExpandibles();
        creador.setFiltro(10, nombre, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxObject.isEmpty()){
//            nombre=StringUtils.capitalize(nombre);
            creador.insert(nombre);
           auxId=Facade.obtenerSimbMoneda(nombre);
        }
       else
            auxId = (String)auxObject.get(0);
        
       return auxId;
    }
    
    /**Almacena un cliente, si existe actualiza los datos, sino lo crea*/
    public static boolean almacenarCliente(Cliente cliente){
        boolean auxBool=true;
        Facade.sacarComilla(cliente);
        Cliente auxCliente=(Cliente)cliente.clone();
        String auxCadena=cadBusquedaCliente(auxCliente);
        ManejadorCliente creador = new ManejadorCliente();
        creador.setFiltro(2, auxCadena, "nada");
        ArrayList<Object> auxObject = creador.FactoryMethod();
        if (auxCliente.getNormalizado()==false) normalizarCliente(auxCliente);
        if (auxObject.isEmpty()){
            auxBool=creador.insert(auxCliente);
            cliente.setIdCli(obtenerIdFijo("nada", 3));
        }else{
            cliente.setIdCli(((Cliente)auxObject.get(0)).getIdCli());
            auxCliente.setIdCli(cliente.getIdCli());
            auxBool=creador.update(auxCliente);
        }
        return auxBool;
            
    }
    
    
    /** Cadena para ver si el cliente existe o es nuevo*/
    private static String cadBusquedaCliente(Cliente cliente){
        String auxCadena;
        auxCadena="(Tipo LIKE '"+cliente.getTipoDocumento(); 
        auxCadena=auxCadena+"' and Nro_Doc='"+cliente.getNroDocumento()+"') OR ";
        auxCadena=auxCadena+"Mail LIKE '"+cliente.getMail()+"' OR ";
        auxCadena=auxCadena+"(Matricula LIKE '"+cliente.getMatricula()+"' and ";
        auxCadena=auxCadena+"Provincia='"+cliente.getProvincia()+"') ";
        auxCadena=auxCadena+"OR (Nombre like '"+cliente.getNombreCli()+"' and ";
        auxCadena=auxCadena+"Apellido like '"+cliente.getApellidoCli()+"' and ";
        auxCadena=auxCadena+"Fecha_Nac like '"+cliente.getFechaNac()+"') OR"+
                "(Apellido like '"+cliente.getApellidoCli()+"' and Nombre like '"+
                cliente.getNombreCli()+"' and Nro_Doc is null " +
                "and Mail is null " +
                "and Matricula is null " +
                "and fecha_nac is null)" ;
        return auxCadena;
        
    }
    
    /*
 * Metodos internos del Facade
 * 
 */ 
   
    /** No deja insertar valores vacios, los cambia por null*/
    private static void normalizarCliente(Cliente cliente){
        cliente.setNormalizado(true);
        
        if(cliente.getApellidoCli().compareTo("")==0)
            cliente.setApellidoCli("Null");
        else
            cliente.setApellidoCli("'"+capitalLetters(cliente.getApellidoCli())+"'");
        if (cliente.getApellidoCli().length()>30) cliente.setApellidoCli(cliente.getApellidoCli().substring(0, 30)+"'");
        
        
        try{if(cliente.getMail().compareTo("")==0)
            cliente.setMail("Null");
        else
            cliente.setMail("'"+cliente.getMail()+"'");
        if (cliente.getMail().length()>40) cliente.setMail(cliente.getMail().substring(0, 40)+"'");
        }catch(Exception e){cliente.setMail("Null");}
        
       
        try{if(cliente.getDireccion().compareTo("")==0)
            cliente.setDireccion("Null");
        else
            cliente.setDireccion("'"+cliente.getDireccion()+"'");
        if (cliente.getDireccion().length()>50) cliente.setDireccion(cliente.getDireccion().substring(0, 50)+"'");
        }catch(Exception e){cliente.setDireccion("Null");}
        
        
        try{if(cliente.getMatricula().compareTo("")==0)
            cliente.setMatricula("Null");
        else
            cliente.setMatricula("'"+cliente.getMatricula()+"'");
        if (cliente.getMatricula().length()>20) cliente.setMatricula(cliente.getMatricula().substring(0, 20)+"'");
        }catch(Exception e){cliente.setMatricula("Null");}
        
        
        if(cliente.getNombreCli().compareTo("")==0)
            cliente.setNombreCli("Null");
        else
            cliente.setNombreCli("'"+capitalLetters(cliente.getNombreCli())+"'");
        if (cliente.getNombreCli().length()>30) cliente.setNombreCli(cliente.getNombreCli().substring(0, 30)+"'");
        
        
        try{if(cliente.getNroDocumento().compareTo("")==0)
            cliente.setNroDocumento("Null");
        else
            cliente.setNroDocumento("'"+cliente.getNroDocumento()+"'");
        if (cliente.getNroDocumento().length()>10) cliente.setNroDocumento(cliente.getNroDocumento().substring(0, 10)+"'");
        }catch(Exception e){cliente.setNroDocumento("Null");}
        
        
        try{if(cliente.getFechaNac().compareTo("")==0)
            cliente.setFechaNac("Null");
        else
            cliente.setFechaNac("'"+cliente.getFechaNac()+"'");
        }catch(Exception e){cliente.setFechaNac("Null");}
        
        
        try{if(cliente.getTelFijo().compareTo("")==0)
            cliente.setTelFijo("Null");
        else
            cliente.setTelFijo("'"+cliente.getTelFijo()+"'");
        if (cliente.getTelFijo().length()>30) cliente.setTelFijo(cliente.getTelFijo().substring(0, 30)+"'");
        }catch(Exception e){cliente.setTelFijo("Null");}
        
        
        try{if(cliente.getTelMovil().compareTo("")==0)
            cliente.setTelMovil("Null");
        else
            cliente.setTelMovil("'"+cliente.getTelMovil()+"'");
        if (cliente.getTelMovil().length()>30) cliente.setTelMovil(cliente.getTelMovil().substring(0, 30)+"'");
        }catch(Exception e){cliente.setTelMovil("Null");}
        
        
    }
    
    private static String capitalLetters(String cadena){
        String auxCad="";
        if (cadena.lastIndexOf(" ")==cadena.length()-1 && cadena.length()>0)
            cadena=cadena.substring(0,cadena.length()-1);
        int auxInt=0;
        int com=0;
        while (auxInt!=cadena.length()){
            auxInt=cadena.indexOf(" ", auxInt+1);
            if (com>0) auxCad=auxCad+" ";
            if (auxInt<=com)
                auxInt=cadena.length();
            auxCad=auxCad + cadena.substring(com,com+1).toUpperCase() + cadena.substring(com+1, auxInt).toLowerCase();
            com=auxInt+1;
            
        }
        
        
        return auxCad;
    }

    private static void sacarComilla(Cliente cliente){
    try{
        cliente.setApellidoCli(cliente.getApellidoCli().replaceAll("'"," "));
        cliente.setDireccion(cliente.getDireccion().replaceAll("'"," "));
        cliente.setEspecialidad(cliente.getEspecialidad().replaceAll("'"," "));
        cliente.setHobbie( cliente.getHobbie().replaceAll("'"," "));
        cliente.setLocalidad( cliente.getLocalidad().replaceAll("'"," "));
        cliente.setMail(cliente.getMail().replaceAll("'"," "));
        cliente.setMatricula(cliente.getMatricula().replaceAll("'"," "));
        cliente.setNombreCli(cliente.getNombreCli().replaceAll("'"," "));
        cliente.setPais(cliente.getPais().replaceAll("'"," "));
        cliente.setProvincia(cliente.getProvincia().replaceAll("'"," "));
        cliente.setTelFijo(cliente.getTelFijo().replaceAll("'"," "));
        cliente.setTelMovil(cliente.getTelMovil().replaceAll("'"," "));
    }catch(Exception e){}

    }
    
   
}

